#pragma once

#include "reflect/ClassFactory.h"
using namespace bin;

/// @brief 模板定义实现需要确认显式类型以确认可分配内存单元，
/// @tparam T
/// @param fieldName
/// @param fieldValue
/// @brief
/// 其他，为了保证cpp能调用另一个cpp而不会导致被编译两次，一般会将类和函数的定义与
/// 对应实现进行分开，所以编译时确定生命但没有定义，会留到链接时与其他文件中的定义进行链接；
/// 由此，模板进行编译时不会根据定义直接生成代码，而是根据实例生成对应类型的代码，如果采用分离式
/// 编译，在cpp模板函数只有声明没有定义，而编译器会处于等待链接状态，被调用的类定义由于在cpp中
/// 将被独自编译，但没有具体实现，故不会编译成具体的代码
template <typename T>
void ClassObject::setField(const std::string& fieldName, const T& fieldValue)
{
    ClassField* field = Singleton<ClassFactory>::GetInstance()->getClassField(
        m_className, fieldName);
    size_t offset                        = field->offset();
    *(T*)((size_t)this + offset) = fieldValue;
}

template <typename T>
void ClassObject::getField(const std::string& fieldName, T& fieldValue)
{
    ClassField* field = Singleton<ClassFactory>::GetInstance()->getClassField(
        m_className, fieldName);
    size_t offset = field->offset();
    fieldValue    = *(T*)((size_t)this + offset);
}